/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.util.List;
import modelo.Amigo;
import modelo.Seccion;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Elias Mendoza
 */
public class AmigoDao extends OperacionesDao {
  
  public void relacionar(Seccion sec, Amigo am){
    try{
      iniciarOperacion();
      Seccion seccion = (Seccion) sesion.load(Seccion.class, sec.getId());
      Amigo amigo = (Amigo) sesion.load(Amigo.class, am.getId());
      amigo.addSeccion(seccion);
      sesion.getTransaction().commit();
    }finally{
      sesion.close();
    }
  }

  public Amigo cunsultaAmigoById(int id) {
    Amigo amigo = null;
    try {
      iniciarOperacion();
      amigo = (Amigo) sesion.get(Amigo.class, id);
      System.out.print(amigo.getNombre());
    } finally {
      sesion.close();
    }
    return amigo;

  }

  public int totalAmigos() {
    int total = 0;
    try {
      iniciarOperacion();
      Criteria criteria = sesion.createCriteria(Amigo.class);
      criteria.setProjection(Projections.rowCount());
      total = (Integer) criteria.uniqueResult();

      System.out.println(total);


    } finally {
    }
    return total;
  }

  public List amigos() {
    List lista = null;
    try {
      iniciarOperacion();
      Criteria criteria = sesion.createCriteria(Amigo.class);
      criteria.addOrder(Order.asc("nombre"));
      criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
      lista = criteria.list();
      for (Object obj : lista) {
        Amigo amigo = (Amigo) obj;
        System.out.println(amigo.getNombre());
      }
    } finally {
    }
    return lista;

  }

  public List amigos(DetachedCriteria query) {
    List lista = null;
    try {
      iniciarOperacion();
      query.addOrder(Order.asc("nombre"));
      lista = query.getExecutableCriteria(sesion).list();
    } finally {
      sesion.close();
    }
    return lista;
  }

  public void pruaba() {
    try {

      iniciarOperacion();


    } finally {
      sesion.close();
    }
  }

  public List consultaSeccionesOfAmigo(int id) {
    List lista = null;
    try {
      iniciarOperacion();
      Query query = sesion.createQuery("select elements(secciones) from Amigo where id= :id");
      query.setParameter("id", id);
      lista = query.list();

    } finally {
      sesion.close();
    }
    return lista;
  }

  public Amigo[] consultaAmigos() {
    List query = null;
    try {
      iniciarOperacion();

      Criteria criteria = sesion.createCriteria(Amigo.class);
      criteria.addOrder(Order.asc("nombre"));
      query = criteria.list();
    } finally {
      sesion.close();
    }
    return (Amigo[]) query.toArray(new Amigo[query.size()]);
  }
}
